home *** CD-ROM | disk | FTP | other *** search
/ BCI NET / BCI NET Dec 94.iso / archives / programming / languages / cleo.lzh / Cleo / source / FCT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-24  |  12.0 KB  |  419 lines

  1. /***************************************************************************
  2. *   Ce fichier, ainsi que tous les  modules  l'accompagnant, peut et  doit *
  3. * etre  copié GRATUITEMENT à la seule condition expresse de conserver      *
  4. * l'INTEGRALITE  du  Code Source, de  la documentation, et  des fichiers   *
  5. * annexes du package. Ce logiciel est Shareware, veuilez envoyer 100 FF à  *
  6. * l'auteur pour recevoir regulièrement les nouvelles versions.             *
  7. * Toute modification est INTERDITE sans l'autorisation écrite de l'auteur. *
  8. *            Tous droits réservés à M. DIALLO Barrou, Juillet 1992.        *
  9. ***************************************************************************/
  10.  
  11. #ifdef msdos
  12.         #include "include\\cleobis.h"
  13.         #include "include\\libs.h"
  14. #else
  15.         #include "include/cleobis.h"
  16.         #include "include/libs.h"
  17. #endif
  18.  
  19. extern BOOL dismode;
  20. extern char *TxtFileName;
  21. extern char *CodeFileName;
  22. extern char *ErrorFileName;
  23. extern char curtoken[];
  24. extern FILE *ErrorF;
  25. extern Erreur Erreurs[];
  26. extern Erreur Avertis[];
  27. extern FILE *CodeF;
  28. extern FILE *TxtF;
  29. extern char *Txt;
  30. extern int *Adress;
  31. extern CONST *symb;
  32. extern VAR *var;
  33. extern PROG *prg;
  34. extern FCTLIB *extfct;
  35. extern int ExecMode;
  36. extern long AdressSize;
  37. extern long TextSize;
  38. extern long SymbolSize;
  39.  
  40. /******************** Fonctions de configuration *******************/
  41.  
  42. void ReadArg(int arc, char **arv)
  43. {
  44.   arc -= 1;  arv += 1;
  45.  
  46. if ((*arv)[0] == '-' && (*arv)[1] == 'v' || (*arv)[1] == 'V')
  47.     {
  48.     printf("\tAll Coding by DIALLO Barrou, special thanks to:\n\t\tFranck Diard, Christophe Lambert\n\t\tand my 'Bignome' Florent Dolidon their moral help!\n");
  49.     End(); exit();
  50.     }
  51.         TxtFileName = (char*)calloc(strlen(*arv)+1,1);
  52.         strcpy(TxtFileName,arv[0]);
  53.   arc -= 1;  arv += 1;
  54.  
  55.   while (arc > 0 && (*arv)[0] == '-')
  56.     {
  57.  
  58.       switch ((*arv)[1])
  59.         {
  60.         case 'O':
  61.         case 'o':
  62.             CodeFileName= (char*)strdup(*arv+2);
  63.             break;
  64.         case 'A':
  65.         case 'a':   dismode=TRUE; break;
  66.         default:
  67.             printf(" Option inconnue '%c%c'\n",(*arv)[0],(*arv)[1]);
  68.           break;
  69.         }
  70.       arc -= 1;
  71.       arv += 1;
  72.     }
  73. if (!CodeFileName)
  74.     {
  75.     CodeFileName= (char*)strdup(DEFAULT_OUT);
  76.     TraitErreur(WARNING, LESSARGS,0,0);
  77.     }
  78. if (arc != 0)
  79.     {
  80.       TraitErreur(RECERROR , BADARGS,0,0);
  81.       printf("Usage: %s Source [-oDest]\n",NAME);
  82.       exit(2);
  83.     }
  84. }
  85.  
  86. void Intro()
  87. {
  88.     printf("Cleobis Language\tVersion %d.%d\n\t(C)opyright July 1992 by DIALLO Barrou\n\n",VERSION, SUBVERSION);
  89. }
  90.  
  91. void TraitErreur(char type, int num, int lig, int col)
  92. {
  93.     BOOL fat=FALSE;
  94.  
  95.     switch(type)
  96.     {
  97.     case WARNING:
  98.         if (ErrorF==NULL)
  99.             printf("** Avertissement %d, %s...\n", Avertis[num].num, Avertis[num].msg);
  100.         else
  101.             fprintf(ErrorF,"** Avertissement %d, %s...\n", Avertis[num].num, Avertis[num].msg);
  102.         break;
  103.     case FATALERROR:
  104.         fat=TRUE;
  105.     case RECERROR:
  106.         if (ErrorF==NULL)
  107.             printf("** Erreur %d, %s\n", Erreurs[num].num, Erreurs[num].msg);
  108.         else
  109.             fprintf(ErrorF,"** Erreur %d, %s\n", Erreurs[num].num, Erreurs[num].msg);
  110.         if (fat)
  111.             { End(); exit(num); }
  112.         else break;
  113.     case TEXTERROR:
  114.         if (!ErrorF)
  115.                                 printf ("L:%d   C:%d ",lig,col);
  116.         else
  117.                                 fprintf (ErrorF,"L:%d C:%d\t",lig,col);
  118.                   printf("*** Erreur %d, <%s> %s\n", Erreurs[num].num, curtoken, Erreurs[num].msg);
  119.                   switch(num)
  120.         {
  121.             case GUILLE:
  122.                  printf("*** Erreur %d, %s\n", Erreurs[num].num, Erreurs[num].msg);
  123.                 break;
  124.             case SYNTAX:
  125.                 break;
  126.             case BADTYPE:
  127.                 break;
  128.             default:
  129.                 break;
  130.         }
  131.         End(); exit(num);
  132.         break;
  133.      default:
  134.         break;
  135.     }
  136. }
  137.  
  138. void FreeProg(void)
  139. {
  140.     PROG *list, *list1;
  141.  
  142.         list = prg; list1= list->next;
  143.         while (list)
  144.         {
  145.                 cfree(list);
  146.                 list=list1;
  147.                 list1=list1->next;
  148.         }
  149. }
  150.  
  151. void FreeConst(void)
  152. {
  153.     CONST *list, *list1;
  154.  
  155.         list = symb; list1= list->next;
  156.         while (list)
  157.         {
  158.                 cfree(list);
  159.                 list=list1;
  160.                 list1=list1->next;
  161.         }
  162. }
  163.  
  164. void FreeVars(void)
  165. {
  166.     VAR *list, *list1;
  167.  
  168.         list = var; list1= list->next;
  169.         while (list)
  170.         {
  171.                 cfree(list);
  172.                 list=list1;
  173.                 list1=list1->next;
  174.         }
  175. }
  176.  
  177. void FreeExternFct(void)
  178. {
  179.     FCTLIB *list = extfct, *list1;
  180.  
  181.     list1= list->next;
  182.     while (list)
  183.         {
  184.            if (list->type) cfree(list->type);
  185.            cfree(list);
  186.            list=list1;
  187.            list1=list1->next;
  188.         }
  189. }
  190.  
  191. void End(void)
  192. {
  193.     if (ErrorF!=NULL) fclose(ErrorF);
  194.          if (CodeF!=NULL)    fclose(TxtF);
  195.          if (ErrorF != NULL) fclose(ErrorF);
  196.          if (Txt!=NULL)      cfree(Txt);
  197.          if (Adress!=NULL)   cfree(Adress);
  198.          if (symb != NULL)   FreeConst();
  199.          if (var != NULL)    FreeVars();
  200.          if (prg != NULL)    FreeProg();
  201.          if (extfct != NULL) FreeExternFct();
  202. }
  203.  
  204. BOOL Alloue(void )
  205. {
  206.     if (!(Adress = (int *)calloc(AdressSize,sizeof(int))))
  207.       {
  208.           TraitErreur(RECERROR,MEMCOMPIL,0,0);
  209.           return(FALSE);
  210.       }
  211.     return(TRUE);
  212. }
  213.  
  214. BOOL Begin()
  215. {
  216.          if (!Alloue()) {End(); return(FALSE); }
  217.          if (!Ouvre()) { End(); return(FALSE); }
  218.  
  219.     return(TRUE);
  220. }
  221.  
  222. void Dis(void)
  223. {
  224.         PROG *list=prg;
  225.         int n=0;
  226.  
  227.                   while (list != NULL)
  228.                   {
  229.                   switch (list->code)
  230.                   {
  231.         case PADR_CHR: printf("%d PADR_CHR %d\n", n, list->operande);
  232.                 break;
  233.         case PADR_INT: printf("%d PADR_INT %d\n", n, list->operande);
  234.                 break;
  235.         case PADR_LINT: printf("%d PADR_LINT %d\n", n, list->operande);
  236.                 break;
  237.         case PADR_REAL: printf("%d PADR_REAL %d\n", n, list->operande);
  238.                 break;
  239.         case PADR_LREAL: printf("%d PADR_LREAL %d\n", n, list->operande);
  240.                 break;
  241.         case PADR_STR: printf("%d PADR_STR %d\n", n, list->operande);
  242.                 break;
  243.         case PADR_BOOL: printf("%d PADR_BOOL %d\n", n, list->operande);
  244.                 break;
  245.         case PADR_ARRAY: printf("%d PADR_ARRAY %d\n", n, list->operande);
  246.                 break;
  247.         case PADR_P2D: printf("%d PADR_P2D %d\n", n, list->operande);
  248.                 break;
  249.         case PADR_P3D: printf("%d PADR_P3D %d\n", n, list->operande);
  250.                 break;
  251.         case PADR_RGB: printf("%d PADR_RGB %d\n", n, list->operande);
  252.                 break;
  253.  
  254.         case PVAL_CHR: printf("%d PVAL_CHR %d\n", n, list->operande);
  255.                 break;
  256.         case PVAL_INT: printf("%d PVAL_INT %d\n", n, list->operande);
  257.                 break;
  258.         case PVAL_REAL: printf("%d PVAL_REAL %d\n",n, list->operande);
  259.                 break;
  260.         case PVAL_STR: printf("%d PVAL_STR %d\n", n, list->operande);
  261.                 break;
  262.  
  263.         case PMEM_CHR: printf("%d PMEM_CHR\n", n);
  264.                 break;
  265.         case PMEM_INT: printf("%d PMEM_INT\n", n);
  266.                 break;
  267.         case PMEM_LINT: printf("%d PMEM_LINT\n", n);
  268.                 break;
  269.         case PMEM_REAL: printf("%d PMEM_REAL\n",n);
  270.                 break;
  271.         case PMEM_LREAL: printf("%d PMEM_LREAL\n",n);
  272.                 break;
  273.         case PMEM_STR: printf("%d PMEM_STR\n", n);
  274.                 break;
  275.         case PMEM_BOOL: printf("%d PMEM_BOOL\n", n);
  276.                 break;
  277.         case PMEM_ARRAY: printf("%d PMEM_ARRAY\n",n);
  278.                 break;
  279.         case PMEM_P2D: printf("%d PMEM_P2D\n",n);
  280.                 break;
  281.         case PMEM_P3D: printf("%d PMEM_P3D\n",n);
  282.                 break;
  283.         case PMEM_RGB: printf("%d PMEM_RGB\n",n);
  284.                 break;
  285.  
  286.         case PMEM_P2D_ALL: printf("%d PMEM_P2D_ALL\n",n);
  287.                 break;
  288.         case PMEM_P3D_ALL: printf("%d PMEM_P3D_ALL\n",n);
  289.                 break;
  290.         case PMEM_RGB_ALL: printf("%d PMEM_RGB_ALL\n",n);
  291.                 break;
  292.  
  293.         case STM_CHR: printf("%d STM_CHR\n", n);
  294.                 break;
  295.         case STM_INT: printf("%d STM_INT\n", n);
  296.                 break;
  297.         case STM_LINT: printf("%d STM_LINT\n", n);
  298.                 break;
  299.         case STM_REAL: printf("%d STM_REAL\n",n);
  300.                 break;
  301.         case STM_LREAL: printf("%d STM_LREAL\n",n);
  302.                 break;
  303.         case STM_STR: printf("%d STM_STR\n", n);
  304.                 break;
  305.         case STM_BOOL: printf("%d STM_BOOL\n", n);
  306.                 break;
  307.         case STM_ARRAY: printf("%d STM_ARRAY\n",n);
  308.                 break;
  309.         case STM_P2D: printf("%d STM_P2D\n",n);
  310.                 break;
  311.         case STM_P3D: printf("%d STM_P3D\n",n);
  312.                 break;
  313.         case STM_RGB: printf("%d STM_RGB\n",n);
  314.                 break;
  315.  
  316.         case DIVS: printf("%d DIVS\n",n);
  317.                 break;
  318.         case MULS: printf("%d MULS\n",n);
  319.                 break;
  320.         case ADD: printf("%d ADD\n",n);
  321.                 break;
  322.         case SUB: printf("%d SUB\n",n);
  323.                 break;
  324.         case NEG: printf("%d NEG\n",n);
  325.                 break;
  326.         case MOD: printf("%d MOD\n",n);
  327.                 break;
  328.         case EQU: printf("%d EQU\n",n);
  329.                 break;
  330.         case LT: printf("%d LT\n",n);
  331.                 break;
  332.         case GT: printf("%d GT\n",n);
  333.                 break;
  334.         case LE: printf("%d LE\n",n);
  335.                 break;
  336.         case GE: printf("%d GE\n",n);
  337.                 break;
  338.         case NE: printf("%d NE\n",n);
  339.                 break;
  340.         case AND: printf("%d AND\n",n);
  341.                 break;
  342.         case OR: printf("%d OR\n",n);
  343.                 break;
  344.         case XOR: printf("%d XOR\n",n);
  345.                 break;
  346.         case NOT: printf("%d NOT\n",n);
  347.                 break;
  348.         case IN: printf("%d IN\n",n);
  349.                 break;
  350.         case EQU_STR: printf("%d EQU_STR\n",n);
  351.                 break;
  352.         case LT_STR: printf("%d LT_STR\n",n);
  353.                 break;
  354.         case GT_STR: printf("%d GT_STR\n",n);
  355.                 break;
  356.         case LE_STR: printf("%d LE_STR\n",n);
  357.                 break;
  358.         case GE_STR: printf("%d GE_STR\n",n);
  359.                 break;
  360.  
  361.         case BNE: printf("%d BNE %d\n",n, Adress[list->operande]);
  362.                 break;
  363.         case BRA: printf("%d BRA %d\n",n, Adress[list->operande]);
  364.                 break;
  365.  
  366.         case PRSTR: printf("%d PRSTR\n",n);
  367.                 break;
  368.         case PRVSTR: printf("%d PRVSTR\n",n);
  369.                 break;
  370.         case PRCHR: printf("%d PRCHR\n",n);
  371.                 break;
  372.         case PRINT: printf("%d PRINT\n",n);
  373.                 break;
  374.         case PRINTCHR: printf("%d PRINTCHR\n",n);
  375.                 break;
  376.         case CHR13: printf("%d CHR13\n",n);
  377.                 break;
  378.         case READ: printf("%d READ\n",n);
  379.                 break;
  380.  
  381.         case ABS: printf("%d ABS\n",n);
  382.                 break;
  383.         case ATAN: printf("%d ATAN\n",n);
  384.                 break;
  385.         case ACOS: printf("%d ACOS\n",n);
  386.                 break;
  387.         case ASIN: printf("%d ASIN\n",n);
  388.                 break;
  389.         case COSH: printf("%d COSH\n",n);
  390.                 break;
  391.         case SINH: printf("%d SINH\n",n);
  392.                 break;
  393.         case COS: printf("%d COS\n",n);
  394.                 break;
  395.         case SIN: printf("%d SIN\n",n);
  396.                 break;
  397.         case EXP: printf("%d EXP\n",n);
  398.                 break;
  399.         case FRAC: printf("%d FRAC\n",n);
  400.                 break;
  401.         case INT: printf("%d INT\n",n);
  402.                 break;
  403.         case LN: printf("%d LN\n",n);
  404.                 break;
  405.         case SQR: printf("%d SQR\n",n);
  406.                 break;
  407.         case SQRT: printf("%d SQRT\n",n);
  408.                 break;
  409.         case RTS: printf("%d RTS\n", n);
  410.                 break;
  411.         case PUSHVAL: printf("%d PUSHVAL %d\n", n, list->operande);
  412.                 break;
  413.         case LIBRARY: printf("%d LIBRARY %d\n", n, list->operande);
  414.                 break;
  415.         }
  416.         list = list->next;
  417.         n++;
  418.         }
  419. }